# -*- coding: utf-8 -*-
from __future__ import annotations
import os
from dotenv import load_dotenv

load_dotenv()

# 允许离线模拟（不调用真实 DeepSeek）
MOCK = os.getenv("MOCK_LLM", "0") == "1"

def _mock_chat(messages: list[dict], *, json_mode: bool = False, **kwargs) -> str:
    # 一个极简的模拟器：当用户问 "2+3是多少？" 时输出工具调用；
    # 其余情况直接给 final。
    last_user = next((m for m in reversed(messages) if m.get("role") == "user"), {})
    content = (last_user.get("content") or "").strip()
    if "2+3" in content:
        return '{"tool":"sum","args":{"a":2,"b":3}}'
    # 默认直接给 final
    return '{"final":"这是一个模拟器回答（未调用真实API）。"}'

def chat(messages: list[dict], 
         *, 
         json_mode: bool = False, 
         model: str | None = None, 
         **kwargs) -> str:
    """调用 DeepSeek Chat Completions。返回 assistant 的 content 字符串。

    参数：
      - messages: OpenAI 兼容的消息列表
      - json_mode: True 时在请求中设置 response_format={"type":"json_object"}
      - model: 指定模型，默认取环境变量 DEEPSEEK_MODEL 或 deepseek-chat
    环境变量：
      - DEEPSEEK_API_KEY
      - DEEPSEEK_BASE_URL (默认 https://api.deepseek.com)
      - DEEPSEEK_MODEL (默认 deepseek-chat)
    """
    if MOCK:
        return _mock_chat(messages, json_mode=json_mode, **kwargs)

    api_key = os.getenv("DEEPSEEK_API_KEY")
    base_url = os.getenv("DEEPSEEK_BASE_URL", "https://api.deepseek.com")
    model = model or os.getenv("DEEPSEEK_MODEL", "deepseek-chat")
    if not api_key:
        raise RuntimeError("缺少 DEEPSEEK_API_KEY。请在 .env 中配置或导出到环境变量。")

    # OpenAI 官方 SDK，指向 DeepSeek 的 base_url（OpenAI 兼容）
    from openai import OpenAI
    client = OpenAI(api_key=api_key, base_url=base_url)

    params = dict(
        model=model,
        messages=messages,
        temperature=kwargs.get("temperature", 0.2),
    )
    if json_mode:
        params["response_format"] = {"type": "json_object"}

    resp = client.chat.completions.create(**params)
    return resp.choices[0].message.content
